home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 297_01 / pp.c < prev    next >
C/C++ Source or Header  |  1980-01-01  |  3KB  |  177 lines

  1. /* pp.c */
  2. /* A trivial pretty printer for lisp-like expressions.
  3.  * This might be useful for finding mistakes with parentheses.
  4.  * There is a provision for quotes that wont necessarily apply.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9.  
  10. #define TOGGLE(Flag) if(Flag)Flag = 0;else Flag = 1;
  11.  
  12. pp(ifp, ofp)
  13. FILE *ifp, *ofp;
  14. {
  15.     int depth = 0;
  16.     int in_dbquotes = 0;
  17.     int in_quotes = 0;
  18.     int in_comments = 0;
  19.     int line_count = 0;
  20.     int previous;
  21.     int c = 0;
  22.  
  23.     do{    
  24.         previous = c;
  25.         c = getc(ifp);
  26.         switch(c)
  27.         {
  28.         case '/':
  29.             if(previous == '*')
  30.             {
  31.                 if(in_comments)
  32.                     in_comments = 0;
  33.                 else
  34.                     fprintf(stderr, "nested comments? line %d\n", line_count);
  35.             }
  36.             putc(c, ofp);
  37.             break;
  38.  
  39.         case '*':
  40.             if(previous == '/')
  41.             {
  42.                 if(!in_comments )
  43.                     in_comments = 1;
  44.                 else
  45.                     fprintf(stderr, "nested comments? line %d\n", line_count);
  46.             }
  47.             putc(c, ofp);
  48.             break;
  49.  
  50.         case '(':
  51.             if(!in_dbquotes && !in_quotes)
  52.                 depth++;
  53.             putc(c, ofp);
  54.             break;
  55.  
  56.         case ')':
  57.             if(depth < 0)continue;
  58.             if(!in_dbquotes && !in_quotes)
  59.                 depth--;
  60.             putc(c, ofp);
  61.             break;
  62.  
  63.         case '\n':
  64.             line_count++;
  65.  
  66.             if(in_quotes )
  67.             {
  68.                 fprintf(stderr, "Newline in quotes, line %d\n", line_count);
  69.             }
  70.  
  71.             if(in_dbquotes )
  72.             {
  73.                 fprintf(stderr, "Newline in double quotes %d\n", line_count);
  74.             }
  75.  
  76.             do{
  77.                 c = getc(ifp);
  78.                 if(c == '\n'){
  79.                     putc(c, ofp);
  80.                     line_count++;
  81.                 }
  82.             }while(isspace(c));
  83.             putc('\n', ofp);
  84.             switch(c)
  85.             {
  86.             case ')':
  87. /*                depth--;    */
  88.                 indent(depth, ofp);
  89.                 break;
  90.  
  91.             case '(':
  92.                 indent(depth, ofp);     
  93. /*                depth++;     */
  94.                 break;
  95.  
  96.             default:
  97.                 indent(depth, ofp);
  98.             }
  99.  
  100.             ungetc(c, ifp);
  101.             break;
  102.  
  103.         case EOF:
  104.             if(depth > 0)
  105.                 fprintf(stderr, "%d ) brackets missing\n", depth);
  106.             if(depth < 0)
  107.                 fprintf(stderr, "%d ( brackets missing\n",-depth);
  108.             if(ofp != stdout)fclose(ofp);
  109.             fclose(ifp);
  110.             return;
  111.  
  112.         case '"':
  113.             if(!in_quotes && !in_comments)TOGGLE(in_dbquotes);
  114.             putc(c, ofp);
  115.             break;
  116.  
  117.         case '\'':
  118.             if(!in_dbquotes && !in_comments)TOGGLE(in_quotes);
  119.             putc(c, ofp);
  120.             break;
  121.  
  122.         default:
  123.             putc(c, ofp);
  124.             break;
  125.         }
  126.     }while(1);
  127.  
  128. }
  129.  
  130. indent(d, ofp)
  131. int d;
  132. FILE *ofp;
  133. {
  134.     while(d > 0){
  135.         d--;
  136.         fprintf(ofp, "  ");
  137.     }
  138. }
  139.  
  140. #ifdef TEST
  141. main()
  142. {
  143.     FILE *ifp;
  144.     if((ifp = fopen("test.pro", "r")) == NULL)
  145.     {
  146.         fprintf(stderr, "Cant open %s\n", "test.pro");
  147.         exit(1);
  148.     }
  149.     pp(ifp, stdout);
  150.  
  151. }
  152.  
  153. #else
  154. main(argc, argv)
  155. int argc;
  156. char *argv[];
  157. {
  158.     int i;
  159.     FILE *ifp;
  160.     if(argc == 1)
  161.     {
  162.         printf("usage: pp files...\n");
  163.         exit(1);
  164.     }
  165.     for(i = 1; i < argc; i++)
  166.     {
  167.         if((ifp = fopen(argv[i], "r")) == NULL)
  168.         {
  169.             fprintf(stderr, "Cant open %s\n", argv[i]);
  170.             continue;
  171.         }
  172.         pp(ifp, stdout);
  173.     }
  174. }
  175. #endif
  176. /* end of file */
  177.